#!/usr/bin/env python3
"""
数据使用示例脚本

展示如何使用data文件夹中的各种数据和处理功能
"""

import os
import sys
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pathlib import Path

# 添加项目根目录到Python路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))

from data.data_utils import DataLoader, DataProcessor, DataValidator
from data.generate_sample_data import SampleDataGenerator


def example_1_load_and_validate_data():
    """示例1: 加载和验证数据"""
    print("=== 示例1: 加载和验证数据 ===")
    
    # 创建数据加载器
    loader = DataLoader()
    validator = DataValidator()
    
    try:
        # 加载原始数据
        raw_data = loader.load_raw_data('sample_data.csv')
        print(f"原始数据形状: {raw_data.shape}")
        print(f"数据列: {list(raw_data.columns)}")
        
        # 验证数据质量
        validation_results = validator.validate_raw_data(raw_data)
        print("数据验证结果:")
        for key, value in validation_results.items():
            print(f"  {key}: {value}")
        
        # 显示数据统计信息
        print("\n数据统计信息:")
        print(raw_data.describe())
        
    except FileNotFoundError:
        print("示例数据文件不存在，请先运行 generate_sample_data.py")
    
    print()


def example_2_preprocess_data():
    """示例2: 数据预处理"""
    print("=== 示例2: 数据预处理 ===")
    
    # 创建数据加载器和处理器
    loader = DataLoader()
    processor = DataProcessor()
    
    try:
        # 加载原始数据
        raw_data = loader.load_raw_data('sample_data.csv')
        
        # 预处理数据
        processed_data = processor.preprocess_raw_data(
            raw_data, 
            normalize=True, 
            remove_noise=True
        )
        
        print(f"预处理后数据形状: {processed_data.shape}")
        print(f"数据范围: [{processed_data.min():.3f}, {processed_data.max():.3f}]")
        print(f"数据均值: {processed_data.mean():.3f}")
        print(f"数据标准差: {processed_data.std():.3f}")
        
        # 保存预处理数据
        processor.save_processed_data(processed_data, 'example_processed.npy')
        print("预处理数据已保存")
        
    except FileNotFoundError:
        print("示例数据文件不存在，请先运行 generate_sample_data.py")
    
    print()


def example_3_feature_analysis():
    """示例3: 特征分析"""
    print("=== 示例3: 特征分析 ===")
    
    loader = DataLoader()
    
    try:
        # 加载特征数据
        features = loader.load_features('features_sample.json')
        
        print("特征数据结构:")
        print(f"  时域特征: {list(features['features']['time_domain'].keys())}")
        print(f"  频域特征: {list(features['features']['frequency_domain'].keys())}")
        
        # 分析时域特征
        time_features = features['features']['time_domain']
        print("\n时域特征统计:")
        for feature_name, values in time_features.items():
            if isinstance(values, list):
                values = np.array(values)
                print(f"  {feature_name}: 均值={values.mean():.3f}, 标准差={values.std():.3f}")
        
        # 分析频域特征
        freq_features = features['features']['frequency_domain']
        print("\n频域特征统计:")
        for feature_name, values in freq_features.items():
            if isinstance(values, list) and feature_name != 'mfcc':
                values = np.array(values)
                print(f"  {feature_name}: 均值={values.mean():.3f}, 标准差={values.std():.3f}")
        
    except FileNotFoundError:
        print("特征数据文件不存在")
    
    print()


def example_4_training_data_analysis():
    """示例4: 训练数据分析"""
    print("=== 示例4: 训练数据分析 ===")
    
    loader = DataLoader()
    
    try:
        # 加载训练数据
        features, labels = loader.load_training_data('training_dataset.h5')
        
        print(f"训练数据形状: {features.shape}")
        print(f"标签数量: {len(labels)}")
        
        # 分析类别分布
        unique_labels, counts = np.unique(labels, return_counts=True)
        print(f"类别数量: {len(unique_labels)}")
        print("类别分布:")
        for label, count in zip(unique_labels, counts):
            print(f"  {label}: {count}")
        
        # 分析特征分布
        print(f"\n特征统计:")
        print(f"  特征均值: {features.mean():.3f}")
        print(f"  特征标准差: {features.std():.3f}")
        print(f"  特征最小值: {features.min():.3f}")
        print(f"  特征最大值: {features.max():.3f}")
        
    except FileNotFoundError:
        print("训练数据文件不存在，请先运行 generate_sample_data.py")
    
    print()


def example_5_data_visualization():
    """示例5: 数据可视化"""
    print("=== 示例5: 数据可视化 ===")
    
    loader = DataLoader()
    
    try:
        # 加载原始数据
        raw_data = loader.load_raw_data('sample_data.csv')
        
        # 创建图表
        fig, axes = plt.subplots(2, 3, figsize=(15, 10))
        fig.suptitle('传感器数据可视化', fontsize=16)
        
        # 加速度计数据
        axes[0, 0].plot(raw_data['timestamp'], raw_data['accel_x'], label='X轴')
        axes[0, 0].plot(raw_data['timestamp'], raw_data['accel_y'], label='Y轴')
        axes[0, 0].plot(raw_data['timestamp'], raw_data['accel_z'], label='Z轴')
        axes[0, 0].set_title('加速度计数据')
        axes[0, 0].set_xlabel('时间 (s)')
        axes[0, 0].set_ylabel('加速度 (m/s²)')
        axes[0, 0].legend()
        axes[0, 0].grid(True)
        
        # 陀螺仪数据
        axes[0, 1].plot(raw_data['timestamp'], raw_data['gyro_x'], label='X轴')
        axes[0, 1].plot(raw_data['timestamp'], raw_data['gyro_y'], label='Y轴')
        axes[0, 1].plot(raw_data['timestamp'], raw_data['gyro_z'], label='Z轴')
        axes[0, 1].set_title('陀螺仪数据')
        axes[0, 1].set_xlabel('时间 (s)')
        axes[0, 1].set_ylabel('角速度 (deg/s)')
        axes[0, 1].legend()
        axes[0, 1].grid(True)
        
        # 加速度计频谱
        from scipy.fft import fft, fftfreq
        sample_rate = 100  # Hz
        n_samples = len(raw_data)
        
        accel_fft = fft(raw_data['accel_x'].values)
        freqs = fftfreq(n_samples, 1/sample_rate)
        
        axes[0, 2].plot(freqs[:n_samples//2], np.abs(accel_fft)[:n_samples//2])
        axes[0, 2].set_title('加速度计频谱')
        axes[0, 2].set_xlabel('频率 (Hz)')
        axes[0, 2].set_ylabel('幅度')
        axes[0, 2].grid(True)
        
        # 数据分布直方图
        axes[1, 0].hist(raw_data['accel_x'], bins=50, alpha=0.7, label='X轴')
        axes[1, 0].hist(raw_data['accel_y'], bins=50, alpha=0.7, label='Y轴')
        axes[1, 0].hist(raw_data['accel_z'], bins=50, alpha=0.7, label='Z轴')
        axes[1, 0].set_title('加速度计数据分布')
        axes[1, 0].set_xlabel('加速度 (m/s²)')
        axes[1, 0].set_ylabel('频次')
        axes[1, 0].legend()
        axes[1, 0].grid(True)
        
        # 相关性矩阵
        sensor_cols = ['accel_x', 'accel_y', 'accel_z', 'gyro_x', 'gyro_y', 'gyro_z']
        corr_matrix = raw_data[sensor_cols].corr()
        
        im = axes[1, 1].imshow(corr_matrix, cmap='coolwarm', aspect='auto')
        axes[1, 1].set_title('传感器数据相关性')
        axes[1, 1].set_xticks(range(len(sensor_cols)))
        axes[1, 1].set_yticks(range(len(sensor_cols)))
        axes[1, 1].set_xticklabels(sensor_cols, rotation=45)
        axes[1, 1].set_yticklabels(sensor_cols)
        
        # 添加颜色条
        plt.colorbar(im, ax=axes[1, 1])
        
        # 时间序列分析
        axes[1, 2].plot(raw_data['timestamp'], raw_data['accel_x'].rolling(10).mean(), label='移动平均')
        axes[1, 2].plot(raw_data['timestamp'], raw_data['accel_x'], alpha=0.5, label='原始数据')
        axes[1, 2].set_title('时间序列分析')
        axes[1, 2].set_xlabel('时间 (s)')
        axes[1, 2].set_ylabel('加速度 (m/s²)')
        axes[1, 2].legend()
        axes[1, 2].grid(True)
        
        plt.tight_layout()
        plt.savefig('data_visualization.png', dpi=300, bbox_inches='tight')
        print("可视化图表已保存为 data_visualization.png")
        
    except FileNotFoundError:
        print("示例数据文件不存在，请先运行 generate_sample_data.py")
    except ImportError:
        print("缺少matplotlib或scipy库，无法生成可视化图表")
    
    print()


def example_6_generate_custom_data():
    """示例6: 生成自定义数据"""
    print("=== 示例6: 生成自定义数据 ===")
    
    # 创建数据生成器
    generator = SampleDataGenerator()
    
    # 生成特定键位的数据
    key_label = 'test_key'
    duration = 2.0
    noise_level = 0.05
    
    print(f"生成键位 '{key_label}' 的数据...")
    custom_data = generator.generate_raw_sensor_data(key_label, duration, noise_level)
    
    print(f"生成数据形状: {custom_data.shape}")
    print(f"时间范围: {custom_data['timestamp'].min():.2f} - {custom_data['timestamp'].max():.2f}")
    print(f"加速度计范围: X[{custom_data['accel_x'].min():.3f}, {custom_data['accel_x'].max():.3f}]")
    print(f"陀螺仪范围: X[{custom_data['gyro_x'].min():.3f}, {custom_data['gyro_x'].max():.3f}]")
    
    # 保存自定义数据
    output_path = f"custom_{key_label}_data.csv"
    custom_data.to_csv(generator.data_root / "raw" / output_path, index=False)
    print(f"自定义数据已保存为: {output_path}")
    
    print()


def main():
    """主函数"""
    print("数据使用示例脚本")
    print("=" * 50)
    
    # 运行所有示例
    example_1_load_and_validate_data()
    example_2_preprocess_data()
    example_3_feature_analysis()
    example_4_training_data_analysis()
    example_5_data_visualization()
    example_6_generate_custom_data()
    
    print("所有示例执行完成！")
    print("\n提示:")
    print("1. 如果某些示例失败，请先运行 generate_sample_data.py 生成示例数据")
    print("2. 可视化功能需要安装 matplotlib 和 scipy 库")
    print("3. 生成的数据文件会保存在相应的子文件夹中")


if __name__ == "__main__":
    main() 